class Solution {
public:
    int minCost(vector<vector<int>>& costs) {
        int n = costs.size();
        vector<vector<int>> dp(n+1,vector<int>(3));
        
        for(size_t i = 1 ; i <= n ; ++i)
        {
            for(size_t j = 0 ; j < 3 ; ++j)
            {
                if(j == 0)
                {
                    //到i位置，若该位置选择红色时的最小花费
                    dp[i][0] = min(dp[i-1][1],dp[i-1][2]) + costs[i-1][0];
                }
                else if(j == 1)
                {
                    //到i位置，若该位置选择蓝色时的最小花费
                    dp[i][1] = min(dp[i-1][0],dp[i-1][2]) + costs[i-1][1];
                }
                else 
                {
                    //到i位置，若该位置选择绿色时的最小花费
                    dp[i][2] = min(dp[i-1][0],dp[i-1][1]) + costs[i-1][2];
                }
            }
        }
        int min = INT_MAX;
        for(size_t i = 0 ; i < 3 ; ++i)
        {
            if(min > dp[n][i])
                min = dp[n][i];
        }
        return min;
    }
};